#ifndef HAFUMANTREE_H_INCLUDED
#define HAFUMANTREE_H_INCLUDED

/******************************************************
 *  Project：
 *  Function:
 *  Description: 哈夫曼树的顺序存储
 *  1. 读取某个文本文件，统计文件中各个字符出现的次数作为权重
 *  2. 构建哈夫曼树，生成每个字符对应的编码,然后将编码保存到压缩文件中
 *  3. 文件解压缩实际就是将压缩文件翻译过来再保存到压缩文件的过程
 *
 *  Author: coder-itl
 ******************************************************
 *  Copyright $NOW_L by coder-itl
 ******************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 编码数量 */
#define MAX_SIZE 256
#define HALF_MAX MAX_SIZE
/*  ascii码数量  0-127 */
#define ASCII_SIZE 128


/* 哈夫曼树节点 */
typedef struct halfNode {
    /* 用来存放节点字符的数据域 */
    char data;
    /* 权重 */
    int weight;
    struct halfNode *leftChild;
    struct halfNode *rightChild;
} HaffNode;

/* 以顺序结构存储的树节点-编码解码的字符映射表 */
HaffNode node[MAX_SIZE];

/* 用来保存所有左孩子节点的数组 */
HaffNode left[HALF_MAX];

/* 用来保存所有右孩子节点的数组 */
HaffNode right[HALF_MAX];

/* 使用二维数组用来存储字符的哈弗曼编码,其中第一维的下标就是这个字符的 ASCII 码 */
char code[MAX_SIZE][HALF_MAX];


/**
 * 构造哈夫曼树
 * @param node 节点数组
 * @param length 节点数组的长度
 */
void CreateHalffmanTree(HaffNode *node, int length);

/**
 * 冒泡排序,默认权值大小降序排序
 * @param node
 * @param length
 */
void SortHaffmanNode(HaffNode *node, int length);

/**
 * 编码过程(压缩)
 * @param node 节点数组
 * @param tempCode  编码后的字符数组(keepCode)
 * @param index  当前操作字符数组下标
 */
void Coding(HaffNode *node, char *tempCode, int index);

/**
 * 解码过程(解压缩)
 * @param node
 * @param flag
 * @return
 */
HaffNode *deCoding(HaffNode *node,int flag);


#endif // HAFUMANTREE_H_INCLUDED
